[따배도] - 도커 컴포즈 빌드에서 운영까지


도커 컴포즈를 사용해보고 익혀봅시다!

도커 컴포즈가 무엇인가

  • 여러 컨테이너를 일괄적으로 정의하고 실행할 수 있는 툴

    • 하나의 서비스를 운영하기 위해서는 여러 개의 애플리케이션이 동작해야 함
    • 컨테이너화 된 애플리케이션들을 통합 관리할 수 있음
    • YAML 파일 형식의 정의를 통해 도커 파일들을 정의하고 사용
    • 또는 도커 컴포즈의 image 명령어를 통해 docker run 명령어처럼 바로 실행도 가능

컴포즈 YAML 파일 명령어 정리

  • version : compose 버전.

    • 버전에 따라 지원 문법이 다름
  • services : 컴포즈를 이용해서 실행할 컨테이너 옵션을 정의
  • build : 빌드할 도커 파일의 위치
  • image : compose를 통해 실행할 이미지를 지정

    • 도커 파일 정의 없이 run 명령어를 통해 image를 허브에서 바로 pull해서 돌리는 역할과 비슷
  • command : 컨테이너에서 실행될 명령어 지정
  • port : 컨테이너가 공개하는 포트를 나열
  • link : 다른 컨테이너와 연계할 때 연계할 컨테이너를 지정
  • expose : 포트를 링크로 연계된 컨테이너에게만 공개할 포트
  • volumes : 컨테이너에 볼륨을 마운드
  • environment : 컨테이너에 적용할 환경변수를 정의
  • restart : 컨테이너가 종료될 때 적용할 restart 정책

    • no : default 값 - 재시작 되지 않음
    • always : 컨테이너를 수동으로 끄기 전까지 항상 재시작
    • on-failure : 오류가 있을 시에 재시작
  • depends_on : 컨테이너 간의 종속성을 정의, 정의한 컨테이너가 먼저 동작

도커 컴포즈 설치

  • 공식 래퍼런스 확인
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
$ docker-compose --version

도커 컴포즈 실습 1

Flask, Redis 컨테이너를 도커 컴포즈를 통해 실행시켜 봅시다.

💡

실습 전 알아두기!

도커 컴포즈는 yml파일 위치가 있는 곳에서 실행을 해주어야 합니다.
따라서 디렉토리 생성 후, 도커 파일 정의, 컴포즈 파일 정의 및 실행을 하는 순서를 추천합니다.

  • 프로젝트 디렉토리 생성
$ mkdir composetest
$ cd composetest
  • 파이썬 [app.py] 파일 생성 - Flask 이용
cat > app.py

import time

import redis
from flask import Flask

app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)

def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)

@app.route('/')
def hello():
    count = get_hit_count()
    return 'Hello World! I have been seen {} times.\n'.format(count)
  • 파이썬 라이브러리 관리 [requirements.txt] 파일 생성
cat > requirements.txt
flask
redis
  • 도커 파일 생성
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]
  • 도커 컴포즈 [docker-compose.yml] 파일 생성
version: '3.9'
services:
  web:
    build: .
    ports:
      - '5000:5000'
  redis:
    image: 'redis:alpine'
  • 도커 컴포즈 yaml 파일 문법 체크
$ docker-compose config
  • 도커 컴포즈 실행
$ docker-compose up

1  docker-compose up 확인

Flask, Redis 컨테이너를 통해 잘 실행된 모습입니다.

  • 도커 컴포즈 yaml 파일에 볼륨 마운트 추가
version: "3.9"
services:
  web:
    build: .
    ports:
      - "5000:5000"
    # ------추가--------
    volumes:
      - .:/code
    environment:
      FLASK_ENV: development
    # -----------------
  redis:
    image: "redis:alpine"
  • 이번에는 도커 컴포즈를 백그라운드로 실행
$ docker-compose up -d
  • [app.py] 파일을 수정 시, 볼륨 마운트를 통해서 바로 컨테이너에 반영되는 모습을 확인
$ vi app.py
...
return Hello Docker!
...

2  volume 사용

  • scale 명령어를 통해 redis 컨테이너 늘리기
$ docker-compose scale redis=3

3  redis 스케일아웃

  • run 명령어를 통해 docker exec 명령어처럼 명령 결과를 받아오기

    • web 컨테이너에 env 명령어를 날린 것과 동일

4  docker-compose run

도커 컴포즈 실습 2

wordpress와 mysql 컨테이너를 도커 컴포즈를 통해 실행시켜 봅시다.

wordpress의 동작 방식과 구성 내용은 도커 network 포스팅 or 공식 래퍼런스 참고

  • 프로젝트 디렉토리 생성
$ mkdir wordpress
$ cd wordpress
  • 도커 컴포즈 [docker-compose.yml] 파일 생성

    • depends_on : db 컨테이너 이름을 가진 서비스가 실행된 후, wordpress 컨테이너 실행
    • volumes : mysql 데이터와 wordpress_data 볼륨 마운트
version: '3.9'

services:
  db:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress

  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    volumes:
      - wordpress_data:/var/www/html
    ports:
      - '8080:80'
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
volumes:
  db_data: {}
  wordpress_data: {}
  • 도커 컴포즈 실행
$ docker-compose up -d
  • wordpress가 생성된 것을 확인

5  wordpress 생성

  • 볼륨 마운트를 확인

    • '/var/lib/docker/volumes/폴더명/볼륨명/_data' 형태로 표시가 됩니다.
$ docker volume inspect 볼륨 데이터 이름

6  volume 확인

  • 해당 경로로 진입해서 확인

    • root 계정 접속 필요
    • mysql과 wordpress의 데이터가 쌓여있는 것을 확인할 수 있습니다.

6-1  volume 확인

  • 도커 컴포즈 정리

    • --volumes 추가 옵션을 통해 볼륨마운트까지 정리된 모습
$ docker-compose down --volume

7  최종

Reference

도커컴포즈 설치


Hello, I'm@nickhealthy
개발자를 꿈꾸고, 파이썬과 클라우드에 관심이 많은 비전공자

Github